<script type="text/javascript">
	function test(){
		var arr = [];//数组填充十个函数
		for(var i = 0;i < 10;i ++){//for 循环，定义十位数组
			arr[i] = function () {//执行0到9共10位，每一位上给一个值函数值；for循环10次，把数组的每一位填充了一个函数
				console.log(i);//打印索引，打印第几位；执行语句不是定义时就执行，i具体什么值要到执行时才知道
			}
		}
		return arr;// 返回数组，在外面接收
	}

	var myArr = test();//十对一的闭包，执行完test后给myArr赋值了十位数组，定义了十个函数，但是没有执行函数，没有打印i;
	//myArr[0]();执行数组第一个函数
	//myArr[1]();把数组10位全部执行完，这么写太麻烦，可以用循环
	for (var j = 0; j < 10; j ++){//执行10个函数
		myArr[j]();//打印时,i已经定义完了，最终i为10，再次打印，i的值不变
	}
</script>

//解决10个10的问题，变成0到9；把i定义出来的时候立马变形，立即执行函数的作用让执行到立即函数时立马变现，让保存到外部的函数定义到立即执行函数里，它和立即执行函数形成闭包，它要访问的变量上它的立即执行函数里面找，立即执行函数通过形参把i锁定到里面去了
<script type="text/javascript">
	function test(){
		var arr = [];
		for(var i = 0; i < 10; i ++){
			(function(j){
					arr[j] = function () {
					console.log(j)
				}
			}(i))
		}
		
		return arr
	}
	var myArr = test();
	for(var j = 0; j < 10; j ++){
		myArr[j]()
	}
</script>

<script type="text/javascript">
	//对应的闭包关系里面的函数对应各自的立即执行函数，十个立即执行函数对应一个test,1对1对10，不是刚才1对10的关系，聚焦来看是1对1的关系
	function test(){
		var arr = [];
		(function(j){
			for(var i = 0; i < 10; i ++){
				arr[i] = function(){
					console.log(j)//让i死死的锁定到里面，每一圈循环绑定i变现，i对应每一圈
				}
			}
		}(i))//产生了十个不同的立即执行函数，每一圈的立即执行函数都不一样

		(function(j){//j将第一次i得1，第二次得2，每一次保存的结果保留了下来，十个立即执行函数，十个j
			for(var i = 0; i < 10; i ++){
				arr[i] = function(){//保存的是对应的立即执行函数的劳动成果
					console.log(j) //在执行时找的j是对应第j个立即执行函数的索引，对应的j被实际参数0传进来了，始终都是0
				}
			}
		}(0))//将i传到j面

		return arr //保存到外部，拿的是立即执行函数的劳动成果
		
	}

	var myArr = test();
	for(var j =0; j < 10; j ++){
		myArr[j]()
	}
</script>

